/**
 * 文件名：@AbstractExpressionExecutor.java <br/>
 * 包名：cn.efunbox.afw.core.regulation <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.regulation;

import java.util.Map;
import java.util.Map.Entry;

import cn.efunbox.afw.core.exception.SystemException;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.resolver.Resolver;

/**
 * 类名：AbstractExpressionExecutor  <br />
 *
 * 功能：抽象表达式实现
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午4:11:44  <br />
 * @version 2015年12月4日
 */
public abstract class AbstractExpressionExecutor implements ExpressionExecutor {
	
	// 规章对象解析器
	protected Resolver<Regulator> regulatorResolver;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月4日 下午4:12:04<br/>
	 * 
	 * @param context
	 * @param field
	 * @param value
	 * @param expression
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.regulation.ExpressionExecutor#execute(cn.efunbox.afw.core.mvc.context.Context, java.lang.String, java.lang.Object, java.lang.String)
	 */
	@Override
	public Object execute(Context context, String field, Object value, String expression) throws Exception {
		if (null != expression) {
			// 解析出表达式
			Map<String, Map<String, String>> expMap = parseExpression(expression);
			
			if (null != expMap && ! expMap.isEmpty()) {
				for (Entry<String, Map<String, String>> entry : expMap.entrySet()) {
					// 取得规章对象
					Regulator regulator = resolveRegulator(entry.getKey());
					
					if (null == regulator) {
						throw new SystemException("regulation.resolve.result.is.null", new Object[] { entry.getKey() });
					}
					
					// 交给规章对象进行处理
					value = regulator.regulate(context, field, value, entry.getValue());
				}
			}
		}
		
		// 返回处理后的值
		return value;
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月4日 下午4:14:12 <br/>
	 */
	protected Regulator resolveRegulator(String name) throws Exception {
		// 这里的异常不做处理，直接报系统异常
		return regulatorResolver.resolve(name);
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月4日 下午4:13:13 <br/>
	 */
	protected abstract Map<String, Map<String, String>> parseExpression(Object expression) throws Exception;

	/**
	 * @version 2015年12月4日-下午4:15:31
	 */
	public void setRegulatorResolver(Resolver<Regulator> regulatorResolver) {
		this.regulatorResolver = regulatorResolver;
	}
}
